#ifndef APIMANAGER_H
#define APIMANAGER_H

#include <QObject>
#include <QNetworkAccessManager>
#include <QNetworkReply>
#include <QTimer>
#include <QJsonObject>
#include <QJsonDocument>
#include <QJsonArray>
#include <QNetworkRequest>
#include <QUrl>
#include "app_version.h"

/**
 * @brief API管理器 - 统一处理所有API请求
 *
 * 根据新的LimeReader API规范实现：
 * - 心跳保活 (/auth/client/heartbeat)
 * - 用户信息获取 (/user/profile)
 * - 订阅信息获取 (/user/subscription)
 * - 设备管理 (/user/devices, /sessions/kick)
 * - 统一错误处理和重试机制
 */

class ApiManager : public QObject
{
    Q_OBJECT

public:
    explicit ApiManager(QObject *parent = nullptr);
    ~ApiManager();

    // 单例模式
    static ApiManager* instance();

    // 认证Token管理
    void setAuthToken(const QString& token);
    QString getAuthToken() const;
    bool hasValidToken() const;

    // 心跳保活
    void startHeartbeat();
    void stopHeartbeat();
    bool isHeartbeatActive() const;

    // 用户信息获取
    void fetchUserProfile();
    void fetchUserSubscription();
    void fetchDeviceList();

    // 设备管理
    void kickDevice(const QString& sessionId);
    void logout();

    // 手动触发心跳（用于启动时验证）
    void sendHeartbeatForValidation();

    // API基础URL管理
    void setApiBase(const QString& apiBase);
    QString getApiBase() const;

    // 版本信息通知（用于LoginDialog调用）
    void notifyVersionInfo(const QString& latestVersion, const QString& downloadUrl, const QString& releaseNotes, const QString& md5Hash);

    // 订阅信息通知（用于LoginDialog调用）
    void notifySubscriptionInfo(const QJsonObject& subscription);

private:
    static ApiManager* s_instance;

signals:
    // 心跳相关信号
    void heartbeatSuccess();
    void heartbeatError(const QString& error);

    // 设备失效信号
    void deviceNotFound();

    // 版本更新相关信号
    void versionInfoReceived(const QString& latestVersion, const QString& downloadUrl, const QString& releaseNotes, const QString& md5Hash);

    // 用户信息相关信号
    void userProfileFetched(const QJsonObject& userProfile);
    void userSubscriptionFetched(const QJsonObject& subscription);
    void deviceListFetched(const QJsonArray& devices);

    // 错误处理信号
    void apiError(const QString& error, const QString& details);

    // 注销相关信号
    void logoutFinished(bool success);
    void networkError(const QString& error);
    void tokenExpired();

    // 设备管理信号
    void deviceKickSuccess(const QString& sessionId);
    void deviceKickError(const QString& error);

private slots:
    void onHeartbeatTimer();
    void onHeartbeatFinished();
    void onUserProfileFinished();
    void onUserSubscriptionFinished();
    void onDeviceListFinished();
    void onDeviceKickFinished();
    void onLogoutFinished();

private:
    // 网络请求基础方法
    QNetworkReply* sendApiRequest(const QString& endpoint,
                                   const QJsonObject& data = QJsonObject(),
                                   const QString& method = "POST");
    QNetworkReply* sendAuthenticatedRequest(const QString& endpoint,
                                         const QJsonObject& data = QJsonObject(),
                                         const QString& method = "POST");

    // 错误处理
    void handleNetworkError(QNetworkReply* reply, const QString& context);
    void handleApiError(QNetworkReply* reply, const QString& context);
    bool isTokenExpired(const QJsonObject& errorResponse);

    // 心跳相关
    void buildHeartbeatPayload(QJsonObject& payload) const;

    // URL构建辅助方法
    QUrl buildApiUrl(const QString& endpoint) const;
    QString getSessionId() const;

    // 数据验证
    bool validateResponse(const QJsonObject& response) const;
    bool validateUserProfile(const QJsonObject& profile) const;
    bool validateSubscription(const QJsonObject& subscription) const;

private:
    QNetworkAccessManager* m_networkManager;
    QTimer* m_heartbeatTimer;
    QString m_authToken;
    QString m_apiBase;
    bool m_heartbeatActive;

    // 重试机制
    static const int MAX_RETRY_ATTEMPTS = 3;
    static const int HEARTBEAT_INTERVAL = 5 * 60 * 1000; // 5分钟
};

#endif // APIMANAGER_H